import java.util.ArrayList;
import java.util.List;

public class TestDemo {

//复习：
    //顺序表就是一个可以扩容的动态数组，其实本质就是对数组进行增删查改
    //优点：1.给定下标，查询速度很快 甚至可以达到时间复杂度为O(1)的情况
    //缺点：删除，插入的速度慢 ，可以达到O(N)，
    //因为删除和插入都需要大量的进行数组的元素的移动去覆盖，所以会很慢

    //所以我们或许去进行删除元素的时候会进行使用其他的数据结构

    public static void main1(String[] args) {
        List<Integer> list = new ArrayList<>();
        //用父类接口来进行ArrayList的引用
        //所以直接实现了这个接口，那么都能够进行引用，那么意味着向上转型也可以进行实现
        //只要Arraylist具体实现了List中的方法，那么都能调用向上转型

        //通过这个接口 只能调用这个接口，当中包含的方法

        ArrayList<Integer> arrayList = new ArrayList<>();
        //通过list这个引用可以调用当前类的所有的可以被调用的方法

        //我们只需要明白了这个优缺点就行，具体情况还是看具体需求
    }


    public static void main(String[] args) {
        /*
        ArrayList的源码的构造方法三：
        public ArrayList(Collection<? extends E> c) {
            Object[] a = c.toArray();
            if ((size = a.length) != 0) {
                if (c.getClass() == ArrayList.class) {
                    elementData = a;
                } else {
                    elementData = Arrays.copyOf(a, size, Object[].class);
                }
            } else {
                // replace with empty array.
                elementData = EMPTY_ELEMENTDATA;
            }
        }

        Collection<? extends E> c
        只要实现了Collection的接口就都可以进行传参
        ？：表示通配符
        E表示通配符的上界，只能传参数的类型时E或者E的子类
         */
        ArrayList<Integer> arrayList = new ArrayList<>();
        //这个Arraylist中的类型是Integer，那么这个ArrayList实现了Collection的接口
        //然后这个Integer表示的是？,即是通配符



        ArrayList<Integer> ret = new ArrayList<>(arrayList);
        //我们声明的Integer类型，所以E的希望存储类型也是Integer类型或其子类
        //这个E也是Integer，只不过是这个ret的
        //但前面的list它的类型是Integer类型 ，所以就可以传入，因为与它所声明的类型是相同的或子类，就可以进行传入


        //传的是arraylist是ArrayList这个类，它也实现了collection的接口
        //那么此时的E就是这个Integer类型，都是泛型
        //所以这个arrayList是Integer的子类或者它本身
        //其实这种就是传入的泛型类，将泛型类作为了参数

    }


}
